package figuren;

public class Kochkurve extends Kurve
{

	private int		startGrad;
	private int		startBreite;
	private double	startX			= 50;
	private double	startY			= 200;
	private int		startWinkel		= 0;	// normalerweise wuenschen wir eine waagerechtekurve
	private double	minimaleStrecke	= 0;

	public Kochkurve(int grad, int kochKurvenBreite)
	{
		this.startGrad = grad;
		this.startBreite = kochKurvenBreite;
		this.minimaleStrecke = kochKurvenBreite;
		erstelleAessereLinie(this.startGrad, this.startX, this.startY, this.startWinkel,
				this.startBreite); // Startwerte
	}

	public double umfang()
	{

		// lange von einzelner strecke mal 4^grad
		return this.minimaleStrecke * Math.pow(4, this.startGrad);
	}

	/**
	 * @param grad
	 * @param x_1
	 * @param y_1
	 * @param winkel_1_in_Rad
	 * @param kantenLaenge
	 * <br>
	 *            Grad 0 ist eine Kante also Gerade <br>
	 *            x_1, y_1 startpunt der kante kantenLaenge <br>
	 *            Laenge einer kante <br>
	 *            winkel zwischen kanten, ist in radians
	 * */
	private void erstelleAessereLinie(int grad, double x_1, double y_1, double winkel_1_in_Radian,
			double kantenLaenge)
	{
		if (grad == 0)
		{
			/*
			 * abbruch der rekursion, punkte in die aessere linie hinzufuegen double koordinaten
			 * werden erst hier in point int pixel umgewandelt
			 */
			Point p_1 = new Point(x_1, y_1);
			Point p_2 = new Point((x_1 + kantenLaenge * Math.cos(winkel_1_in_Radian)),
					(y_1 + kantenLaenge * Math.sin(winkel_1_in_Radian)));

			if (!this.aussenLinie.contains(p_1))
			{
				/*
				 * Die pruefung ob vorhanden nur, weil ende der vorgaengerkante mit start nachster
				 * kante uebereinstimmt
				 */
				this.aussenLinie.add(p_1);
			}

			this.aussenLinie.add(p_2);
		} else
		{
			/*
			 * Die kante in vier unterkanten splitten xy1 bis xy4 sind Startpunkte der kanten
			 */

			// obwohl vier teilkanten, muessen wir durch drei teilen weil _/\_
			kantenLaenge = kantenLaenge / 3;
			this.minimaleStrecke = kantenLaenge;

			// _
			erstelleAessereLinie(grad - 1, x_1, y_1, winkel_1_in_Radian, kantenLaenge);

			// _/
			double x_2 = x_1 + kantenLaenge * Math.cos(winkel_1_in_Radian);
			double y_2 = y_1 + kantenLaenge * Math.sin(winkel_1_in_Radian);
			/* 60 grad in Radians umgewandeln, da java damit rechent sin, cos */
			double winkel_2_in_Radian = winkel_1_in_Radian - Math.toRadians(60);
			erstelleAessereLinie(grad - 1, x_2, y_2, winkel_2_in_Radian, kantenLaenge);

			// _/\
			double x_3 = x_2 + kantenLaenge * Math.cos(winkel_2_in_Radian);
			double y_3 = y_2 + kantenLaenge * Math.sin(winkel_2_in_Radian);
			/* 60 grad in Radians umgewandeln, da java damit rechent sin, cos */
			double winkel_3_in_Radian = winkel_1_in_Radian + Math.toRadians(60);
			erstelleAessereLinie(grad - 1, x_3, y_3, winkel_3_in_Radian, kantenLaenge);

			// _/\_
			double x_4 = x_3 + kantenLaenge * Math.cos(winkel_3_in_Radian);
			double y_4 = y_3 + kantenLaenge * Math.sin(winkel_3_in_Radian);
			/* Kante 4 ist sogesagt fortsetzung der Kante 1, deswegen hat sie die gleiche winkel */
			double winkel_4_in_Radian = winkel_1_in_Radian;
			erstelleAessereLinie(grad - 1, x_4, y_4, winkel_4_in_Radian, kantenLaenge);
		}
	}
}
